#!/usr/bin/env bash
set -e
mkdir -p /opt/tmp/
mkdir -p /opt/script/

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/1.2.6/hbase-1.2.6-bin.tar.gz
tar -zxvf hbase-1.2.6-bin.tar.gz

mv hbase-1.2.6/ /opt/hbase
mv hbase-1.2.6-bin.tar.gz /opt/tmp/


echo -e "
export HBASE_HOME=/opt/hbase/
export PATH=\$HBASE_HOME/bin:\$PATH
">>/etc/profile
#http://www.cnblogs.com/freeweb/p/5526080.html


env=/opt/hbase/conf/hbase-env.sh
site=/opt/hbase/conf/hbase-site.xml


#hbase-env
echo -e "
export JAVA_HOME=/usr/lib/jdk1.8/
export HBASE_MANAGES_ZK=false
">> $env

#hbase-site.xml

sed -i "s/<\/configuration>//g"  $site
echo -e "
<property>
    <name>hbase.rootdir</name>
    <value>hdfs://ns/hbase</value> <!-- 指定hbase在HDFS上存储的路径 -->
</property>
<property>
    <name>hbase.cluster.distributed</name><!-- 指定hbase是分布式的 -->
    <value>true</value>
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>hk,hk2,hk3</value><!-- 指定zk的地址，多个用“,”分割 -->
</property>
<property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/opt/zookeeper/zookeeper/data</value>
</property>
">>$site
echo "</configuration>" >> $site


#regionservers
echo -e "hk2
hk3" >/opt/hbase/conf/regionservers


 cp /opt/hadoop/etc/hadoop/core-site.xml /opt/hbase/conf/
 cp /opt/hadoop/etc/hadoop/hdfs-site.xml /opt/hbase/conf/




#count 'repayment'
#alter 'repayment',{NAME=>'data',VERSIONS=>1}
#truncate ‘repayment’ 清空表 ??




# hbase-daemon.sh start master
#  hbase-daemon.sh start regionserver
#hbase shell



#1.2 Row Key
#HBase中row key用来检索表中的记录，支持以下三种方式：
#通过单个row key访问：即按照某个row key键值进行get操作；
#通过row key的range进行scan：即通过设置startRowKey和endRowKey，在这个范围内进行扫描；
#全表扫描：即直接扫描整张表中所有行记录。
#在HBase中，row key可以是任意字符串，最大长度64KB，实际应用中一般为10~100bytes，存为byte[]字节数组，一般设计成定长的。
#row key是按照字典序存储，因此，设计row key时，要充分利用这个排序特点，将经常一起读取的数据存储到一块，将最近可能会被访问的数据放在一块。
#举个例子：如果最近写入HBase表中的数据是最可能被访问的，可以考虑将时间戳作为row key的一部分，由于是字典序排序，所以可以使用Long.MAX_VALUE - timestamp作为row key，这样能保证新写入的数据在读取时可以被快速命中。
#1.3 Column Family
#不要在一张表里定义太多的column family。目前Hbase并不能很好的处理超过2~3个column family的表。因为某个column family在flush的时候，它邻近的column family也会因关联效应被触发flush，最终导致系统产生更多的I/O。感兴趣的同学可以对自己的HBase集群进行实际测试，从得到的测试结果数据验证一下。
#1.4 In Memory
#创建表的时候，可以通过HColumnDescriptor.setInMemory(true)将表放到RegionServer的缓存中，保证在读取的时候被cache命中。
#1.5 Max Version
#创建表的时候，可以通过HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本，如果只需要保存最新版本的数据，那么可以设置setMaxVersions(1)。
#1.6 Time To Live
#创建表的时候，可以通过HColumnDescriptor.setTimeToLive(int timeToLive)设置表中数据的存储生命期，过期数据将自动被删除，例如如果只需要存储最近两天的数据，那么可以设置setTimeToLive(2 * 24 * 60 * 60)。
#1.7 Compact & Split
#在HBase中，数据在更新时首先写入WAL 日志(HLog)和内存(MemStore)中，MemStore中的数据是排序的，当MemStore累计到一定阈值时，就会创建一个新的MemStore，并且将老的MemStore添加到flush队列，由单独的线程flush到磁盘上，成为一个StoreFile。于此同时， 系统会在zookeeper中记录一个redo point，表示这个时刻之前的变更已经持久化了(minor compact)。
#StoreFile是只读的，一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后，就会进行一次合并(major compact)，将对同一个key的修改合并到一起，形成一个大的StoreFile，当StoreFile的大小达到一定阈值后，又会对 StoreFile进行分割(split)，等分为两个StoreFile。
#由于对表的更新是不断追加的，处理读请求时，需要访问Store中全部的StoreFile和MemStore，将它们按照row key进行合并，由于StoreFile和MemStore都是经过排序的，并且StoreFile带有内存中索引，通常合并过程还是比较快的。
#实际应用中，可以考虑必要时手动进行major compact，将同一个row key的修改进行合并形成一个大的StoreFile。同时，可以将StoreFile设置大些，减少split的发生。